#include "../include/SurfaceLight.h"

#include <cstdlib>
#include <math.h>

SurfaceLight::SurfaceLight()
{
    //ctor
}

/**
* Constructeur d'un soleil
* @param position position du centre du soleil
* @return une lumière surfacique
*/
SurfaceLight::SurfaceLight(pVect position)
{
    this->position = position;
}

/**
* Constructeur d'un soleil
* @param position position du centre du soleil
* @param couleur couleur du soleil
* @param puissance puissance émise par le soleil
* @return une lumière surfacique
*/
SurfaceLight::SurfaceLight(pVect position, Color couleur, float puissance)
{
    this->position = position;
    this->couleur = couleur;
    this->puissance = puissance;
}

/**
* Constructeur d'un soleil
* @param position position du centre du soleil
* @param couleur couleur du soleil
* @param puissance puissance émise par le soleil
* @param nbrr nb de points lumineux
* @param rsoleil rayon du soleil
* @return une lumière surfacique
*/
SurfaceLight::SurfaceLight(pVect position, Color couleur, float puissance, int nbrr, float rsoleil)
{
    this->position = position;
    this->couleur = couleur;
    this->puissance = puissance;
    this->nbrr = nbrr;
    this->rsoleil = rsoleil;
}

SurfaceLight::~SurfaceLight()
{
    //dtor
}

float SurfaceLight::getPuissanceAtPoint(HitPoint * hp, Scene * scene){
    //choix du nombre de point lumineux sur la surface lumineuse
    int nbrPointLumi = this->nbrr;
    //choix du rayon de la sphere lumineuse
    float rayonSoleil = this->rsoleil;
    float totalPuissance = 0;

    //-----pour chaque point lumineux du soleil
    for(int i=0; i<nbrPointLumi; i++){
        //création d'un point aléatoire sur le soleil
        float x, y, z;
        float r1 = (float)rand() / (float)RAND_MAX;
        float r2 = (float)rand() / (float)RAND_MAX;
        x = 2*rayonSoleil * cos(2*M_PI*r1) * sqrt(r2*(1-r2));
        y = 2*rayonSoleil * sin(2*M_PI*r1) * sqrt(r2*(1-r2));
        z = rayonSoleil * (1- 2*r2);
        pVect pntLumi(x,y,z);
        pntLumi += this->position;

        //calcul de la puissance recut par le hp
        //vecteur point d'intersection -> lumière ponctuelle
        pVect vObjLum = pntLumi - hp->position;
        vObjLum.normalize();
        //calcul du cosinus de l'angle entre le rayon lumieux et la normale de l'objet
        //calcul de l'intensité de l'action de la lumière sur le point d'intersection
        float scal = vObjLum * hp->normale;
        if(scal<0) scal = -scal;

        //si l'objet n'est PAS à l'ombre il recoit de la puissance lumineuse
        if(this->ombrePoint(hp,pntLumi,scene)){
            totalPuissance += this->puissance*scal;
        }
    }//-----Fin du parcours de chaque point lumineu du soleil

    //renvoie de la moyenne des puissance lumineuse
    totalPuissance /= nbrPointLumi;
    return totalPuissance;
}
